package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;

    /*
    * 添加套餐
    * 既要添加套餐的基本信息,也要添加套餐和菜品的关联信息,并且还要为setmeal_dish 的id赋值
    * */
    @Override
    public void saveQ(SetmealDto setmealDto) {
        //添加套餐的基本信息
        this.save(setmealDto);

        //添加套餐相关联的菜品的信息
        List<SetmealDish> dishList = setmealDto.getSetmealDishes();
        dishList.forEach(setmealDish ->
                {
                    setmealDish.setSetmealId(setmealDto.getId());
                }
                );
        //保存和套餐相关联的菜品信息
        setmealDishService.saveBatch(dishList);
    }


    /*
    * 删除套餐
    * 查询套餐的状态,判断是否可以删除,如果可以删除,先删除套餐表中的数据,然后再删除与套餐表相关联的菜品信息,
    * 如果不能删除,则像用户提示,该套餐不能删除,正在售卖中
    *
    * */
    @Override
    public void removeWithDish(List ids) {
        //查询套餐的状态
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealLambdaQueryWrapper.in(Setmeal::getId, ids);
        setmealLambdaQueryWrapper.eq(Setmeal::getStatus, 1);
        int count = this.count(setmealLambdaQueryWrapper);

        if (count > 0) {
           throw new CustomException("该套餐不能删除,正在售卖中");
        }else {
            //可以删除,删除套餐表中的数据
            this.removeByIds(ids);
        }



        //再删除与套餐表相关联的菜品信息
        LambdaQueryWrapper<SetmealDish> setmealDtoLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealDtoLambdaQueryWrapper.in(SetmealDish::getSetmealId, ids);
        setmealDishService.remove(setmealDtoLambdaQueryWrapper);

    }



    /*
     * 修改套餐时套餐以及菜品信息的回显
     *
     * 根据id查询套餐里面的信息,然后把套餐里面的信息赋值给SetmealDto,
     * 然后再查询套餐信息里面的菜品信息,并且把菜品信息赋值给setmealDto,然后把SetmealDto返回给页面
     * */
    @Override
    public SetmealDto getByIdDish(Long id) {
        //根据id查询套餐信息
        Setmeal setmeal = this.getById(id);
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(setmeal, setmealDto);

        //查询套餐信里面的菜品信息
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SetmealDish::getSetmealId, id);
        List<SetmealDish> list = setmealDishService.list(wrapper);
        setmealDto.setSetmealDishes(list);

        return setmealDto;
    }


    /**
     * 修改套餐信息
     * 先修改套餐的基本信息(Setmeal),
     * 然后再修改该套餐下的菜品信息(原理就是先删除该套餐下的菜品信息,然后再添加菜品信息,并且还要为该菜品信息赋值id    setmeal_dish)
     * @param setmealDto
     */
    @Override
    public void updates(SetmealDto setmealDto) {
        //修改套餐信息
        this.updateById(setmealDto);

        //删除原有的菜品信息
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
        setmealDishService.remove(wrapper);

        //添加客户修改后的菜品信息,并且还要为该菜品赋值id
        List<SetmealDish> list = setmealDto.getSetmealDishes();

        list.forEach(setmealDish ->
                {
                    setmealDish.setSetmealId(setmealDto.getId());
                }
                );
        setmealDishService.saveBatch(list);

    }



}
